﻿using System;
using System.Collections.Generic;
using System.Web.UI;
using System.Web.UI.WebControls;
using Tesla.Excepciones;
using Tesla.Validador;
using System.Web;
using Rendiciones.Logica.Modelos;
using Rendiciones.Web.usercontrols;
using System.Globalization;

namespace Rendiciones.Web.infraestructura
{
    public class MasterPageBase : MasterPage
    {
        public Usuario UsuarioConectado
        {
            get
            {
                var usuario = (Usuario)GetSesionValue<Usuario>("Usuario");
                return usuario;
            }
            set
            {
                SetSesionValue("Usuario", value);
            }
        }

        private string GetSesionValue(string key)
        {
            for (var i = 0; i < Session.Keys.Count; i++)
                if (Session.Keys[i].Equals(key))
                    return Session[key].ToString();
            return "";
        }
        private object GetSesionValue<T>(string key)
        {
            for (var i = 0; i < Session.Keys.Count; i++)
                if (Session.Keys[i].Equals(key))
                    return (T)Session[key];
            return null;
        }
        private void SetSesionValue<T>(string key, T value)
        {
            for (var i = 0; i < Session.Keys.Count; i++)
            {
                if (!Session.Keys[i].Equals(key)) continue;
                Session[key] = value;
                return;
            }
            Session.Add(key, value);
        }

        public bool ValidarFecha(string fecha, char separador)
        {
            if (string.IsNullOrEmpty(fecha)) return false;
            if (!fecha.Contains(separador.ToString(CultureInfo.InvariantCulture))) return false;
            if (fecha.Split(separador).Length != 3) return false;
            if (int.Parse(fecha.Split(separador)[0]) < 0 || int.Parse(fecha.Split(separador)[0]) > 31) return false;
            if (int.Parse(fecha.Split(separador)[1]) < 0 || int.Parse(fecha.Split(separador)[1]) > 12) return false;
            if (int.Parse(fecha.Split(separador)[2]) < 1950 || int.Parse(fecha.Split(separador)[2]) > 2050) return false;
            try
            {
                var dt = new DateTime(int.Parse(fecha.Split(separador)[2]), int.Parse(fecha.Split(separador)[1]), int.Parse(fecha.Split(separador)[0]));
                return true;
            }
            catch
            {
                return false;
            }
        }

        public DateTime? StringToDatetime(string fecha, char caracter)
        {
            if (!ValidarFecha(fecha, caracter)) return null;
            return new DateTime(int.Parse(fecha.Split(caracter)[2]), int.Parse(fecha.Split(caracter)[1]), int.Parse(fecha.Split(caracter)[0]));
        }

        public void MostrarError(string mensaje, string redirect = "")
        {
            ctrlMesageBox ucMessageBox = (ctrlMesageBox)this.FindControl("ctrlMesageBox");
            if (ucMessageBox == null) ucMessageBox = (ctrlMesageBox)this.Master.FindControl("ctrlMesageBox");
            if (ucMessageBox != null)
                ucMessageBox.Mostrar(mensaje, true, "", ETipoMensaje.Error, redirect);
        }
        public void MostrarOk(string mensaje, string titulo, string redirect = "")
        {
            ctrlMesageBox ucMessageBox = (ctrlMesageBox)this.FindControl("ctrlMesageBox");
            if (ucMessageBox == null) ucMessageBox = (ctrlMesageBox)this.Master.FindControl("ctrlMesageBox");
            if (ucMessageBox != null)
                ucMessageBox.Mostrar(mensaje, false, titulo, ETipoMensaje.Exito, redirect);
        }
        public void MostrarOk(string mensaje, string redirect = "")
        {
            ctrlMesageBox ucMessageBox = (ctrlMesageBox)this.FindControl("ctrlMesageBox");
            if (ucMessageBox == null) ucMessageBox = (ctrlMesageBox)this.Master.FindControl("ctrlMesageBox");
            if (ucMessageBox != null)
                ucMessageBox.Mostrar(mensaje, true, "", ETipoMensaje.Exito, redirect);
        }
        public void MostrarInfo(string mensaje, string redirect = "")
        {
            ctrlMesageBox ucMessageBox = (ctrlMesageBox)this.FindControl("ctrlMesageBox");
            if (ucMessageBox == null) ucMessageBox = (ctrlMesageBox)this.Master.FindControl("ctrlMesageBox");
            if (ucMessageBox != null)
                ucMessageBox.Mostrar(mensaje, true, "", ETipoMensaje.Información, redirect);
        }

        public void MostrarAdvertencia(string mensaje, string redirect = "")
        {
            ctrlMesageBox ucMessageBox = (ctrlMesageBox)this.FindControl("ctrlMesageBox");
            if (ucMessageBox == null) ucMessageBox = (ctrlMesageBox)this.Master.FindControl("ctrlMesageBox");
            if (ucMessageBox != null)
                ucMessageBox.Mostrar(mensaje, true, redirect: redirect);
        }

        public string GetPageName()
        {
            var arrResult = HttpContext.Current.Request.RawUrl.Split('/');
            var result = arrResult[arrResult.GetUpperBound(0)];
            arrResult = result.Split('?');
            return arrResult[arrResult.GetLowerBound(0)];
        }

        public string GetPage()
        {
            var arrResult = HttpContext.Current.Request.RawUrl.Split('/');
            var result = arrResult[arrResult.GetUpperBound(0)];
            return result;
        }
        
        #region >>>> Validador

        public void MuestraMensajeError(Control controlContenedor, string mensaje) { MuestraMensaje(controlContenedor, mensaje, ETipoMensaje.Error); }
        public void MuestraMensajeOk(Control controlContenedor, string mensaje) { MuestraMensaje(controlContenedor, mensaje, ETipoMensaje.Exito); }
        public void MuestraMensajeInfo(Control controlContenedor, string mensaje) { MuestraMensaje(controlContenedor, mensaje, ETipoMensaje.Información); }
        public void MuestraMensajeAdvertencia(Control controlContenedor, string mensaje) { MuestraMensaje(controlContenedor, mensaje, ETipoMensaje.Exclamación); }
        private void MuestraMensaje(Control controlContenedor, string mensaje, ETipoMensaje tipoMensaje = ETipoMensaje.Información)
        {
            LimpiarErrores(controlContenedor);
            switch (tipoMensaje)
            {
                case ETipoMensaje.Exito: MostrarMensajeEnEditor(controlContenedor, mensaje, "~/img/icons/Mensaje/icoExito.png"); break;
                case ETipoMensaje.Error: MostrarMensajeEnEditor(controlContenedor, mensaje, "~/img/icons/Mensaje/icoError.png"); break;
                case ETipoMensaje.Exclamación: MostrarMensajeEnEditor(controlContenedor, mensaje, "~/img/icons/Mensaje/icoExclamacion.png"); break;
                case ETipoMensaje.Información: MostrarMensajeEnEditor(controlContenedor, mensaje, "~/img/icons/Mensaje/icoInfo.png"); break;
            }
        }

        private static void MuestraError(Control control, string mensaje)
        {
            if (control is TextBox)
            {
                ((TextBox)control).CssClass = ((TextBox)control).CssClass += " error";
                ((TextBox)control).ToolTip = mensaje;
            }
            if (control is Label)
            {
                ((Label)control).CssClass = ((Label)control).CssClass += " error";
                ((Label)control).ToolTip = mensaje;
            }
            if (control is CheckBox)
            {
                ((CheckBox)control).CssClass = ((CheckBox)control).CssClass += " error";
                ((CheckBox)control).ToolTip = mensaje;
            }
            if (control is RadioButton)
            {
                ((RadioButton)control).CssClass = ((RadioButton)control).CssClass += " error";
                ((RadioButton)control).ToolTip = mensaje;
            }
            if (control is GridView)
            {
                ((GridView)control).CssClass = ((GridView)control).CssClass += " error";
                if (((GridView)control).HeaderRow != null)
                    ((GridView)control).HeaderRow.ToolTip = mensaje;
            }

            if (control is UserControl)
            {
                if (control is UserControlBase)
                    ((UserControlBase)control).MarcarError(mensaje);
            }

            if ((!(control is DropDownList))) return;
            ((DropDownList)control).CssClass = ((DropDownList)control).CssClass += " error";
            ((DropDownList)control).ToolTip = mensaje;
        }

        private static void MostrarMensajeEnEditor(Control controlContenedor, string mensaje, string icono)
        {
            var control = controlContenedor.FindControl("Errores" + controlContenedor.ID.Substring(3));
            control.Visible = true;
            ((Image)control.FindControl("ImgErrores" + controlContenedor.ID.Substring(3))).ImageUrl = icono;
            ((Label)control.FindControl("lblErrores" + controlContenedor.ID.Substring(3))).Text = mensaje;
        }

        protected void MostrarMensajeError(Exception exception, Control controlContenedor = null)
        {
            if (controlContenedor == null)
                controlContenedor = Master == null ? null : Master.FindControl("pnlSitio");
            if (controlContenedor == null) return;
            var mensaje = "<ul><li><b>Error: </b>" + exception.Message + "</li><li><b>StackTrace: </b>" + exception.StackTrace + "</li>";
            MuestraMensajeError(controlContenedor, mensaje);
        }

        public void MuestraErroresDeValidacion(Control controlContenedor, bool mostrarMensaje, ResultadoValidacionException resultadoValidacionException)
        {
            var errores = resultadoValidacionException.MensajesDeValidacion;

            LimpiarErrores(controlContenedor);
            if (mostrarMensaje)
                MuestraMensajeError(controlContenedor, PrepararMensaje(resultadoValidacionException.Message, errores));
            errores.ForEach(e =>
            {
                if (String.IsNullOrEmpty(e.Mensaje)) return;
                var controlAludido = ObtieneCampoDesdeError(controlContenedor, e);
                if (controlAludido != null)
                    MuestraError(controlAludido, e.Mensaje);
            });
        }
        public void LimpiarErrores(Control controlContenedor)
        {
            var control = controlContenedor.FindControl("Errores" + controlContenedor.ID.Substring(3));
            control.Visible = false;
            ((Label)control.FindControl("lblErrores" + controlContenedor.ID.Substring(3))).Text = "";
            LimpiaTodosLosErrores(controlContenedor);
        }

        private static string PrepararMensaje(string msg, IEnumerable<MensajeDeValidacion> errores)
        {
            string[] mensaje = { "<ul><li><b>" + msg + "</b></li>" };
            if (Configuracion.MostrarErrorCompleto)
                foreach (var error in errores)
                    if (!string.IsNullOrEmpty(error.Mensaje))
                        mensaje[0] += "<li>" + error.Mensaje + "</li>";

            mensaje[0] += "</ul>";
            return mensaje[0];
        }
        private Control ObtieneCampoDesdeError(Control controlContenedor, MensajeDeValidacion e)
        {
            var control = controlContenedor.FindControl("txt" + e.NombreCampo);
            if (control == null)
                control = controlContenedor.FindControl("ddl" + e.NombreCampo);
            if (control == null)
                control = controlContenedor.FindControl("lbl" + e.NombreCampo);
            if (control == null)
                control = controlContenedor.FindControl("chk" + e.NombreCampo);
            if (control == null)
                control = controlContenedor.FindControl("rbt" + e.NombreCampo);
            if (control == null)
                control = controlContenedor.FindControl("dgv" + e.NombreCampo);
            if (control == null)
                control = controlContenedor.FindControl("usc" + e.NombreCampo);
            return control;
        }
        private static void LimpiaTodosLosErrores(Control control)
        {
            if (control is TextBox)
            {
                ((TextBox)control).CssClass = ((TextBox)control).CssClass.Replace(" error", "");
                ((TextBox)control).ToolTip = "";
            }
            if (control is DropDownList)
            {
                ((DropDownList)control).CssClass = ((DropDownList)control).CssClass.Replace(" error", "");
                ((DropDownList)control).ToolTip = "";
            }
            if (control is Label)
            {
                ((Label)control).CssClass = ((Label)control).CssClass.Replace(" error", "");
                ((Label)control).ToolTip = "";
            }
            if (control is CheckBox)
            {
                ((CheckBox)control).CssClass = ((CheckBox)control).CssClass.Replace(" error", "");
                ((CheckBox)control).ToolTip = "";
            }
            if (control is RadioButton)
            {
                ((RadioButton)control).CssClass = ((RadioButton)control).CssClass.Replace(" error", "");
                ((RadioButton)control).ToolTip = "";
            }
            if (control is GridView)
            {
                ((GridView)control).CssClass = ((GridView)control).CssClass.Replace(" error", "");
                if (((GridView)control).HeaderRow != null)
                    ((GridView)control).HeaderRow.ToolTip = "";
            }
            if (control is UserControl)
            {
                if (control is UserControlBase)
                    ((UserControlBase)control).LimpiarError();
            }

            if (control.Controls.Count > 0)
                foreach (Control c in control.Controls)
                    LimpiaTodosLosErrores(c);
        }

        #endregion
    }
}